package simple.runtime;

import android.util.TypedValue;
import simple.runtime.android.MainActivity;
import simple.runtime.annotations.SimpleDataElement;
import simple.runtime.annotations.SimpleFunction;
import simple.runtime.annotations.SimpleObject;

/**
 * 像素相关函数。
 * 
 * @author 东子 xhwsd@qq.com
 */
@SimpleObject
public final class 像素 {
  /*
  参考来源：
  https://www.cnblogs.com/xilinch/p/4444833.html
   
  TypedValue：
  https://developer.android.google.cn/reference/android/util/TypedValue
  */

  @SimpleDataElement
  public static final int 像素_绝对 = TypedValue.COMPLEX_UNIT_PX;
  @SimpleDataElement
  public static final int 像素_相对 = TypedValue.COMPLEX_UNIT_DIP;
  @SimpleDataElement
  public static final int 像素_缩放 = TypedValue.COMPLEX_UNIT_SP;

  private 像素() {
  }

  /**
   * 将指定类型的像素值转换为绝对像素（px）值。
   * 
   * @param value 像素值
   * @param unit 类型，可选值钱请参考{@link 像素#像素_像素_绝对}等
   * @return  绝对像素（dp）值
   */
  @SimpleFunction
  public static int 转绝对像素(float value, int unit) {
    return (int) (TypedValue.applyDimension(unit, value,
        MainActivity.getContext().getResources().getDisplayMetrics()));
  }

  /**
   * 将相对像素（dip）值转换为绝对像素（px）值
   * 
   * @param dipValue  相对像素（dip）
   * @return  绝对像素（dp）值
   */
  @SimpleFunction
  public static int 到绝对像素(float dipValue) {
    return (int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue,
        MainActivity.getContext().getResources().getDisplayMetrics()));
  }

  /**
   * 将绝对像素（px）值转换为相对像素（dip）值。
   * 
   * @param pxValue 绝对像素（px）值
   * @return  相对像素（dip）值
   */ 
  @SimpleFunction
  public static int 到相对像素(float pxValue) {
    // 取设备屏幕的密度
    final float scale = MainActivity.getContext().getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
  } 

  /**
   * 将绝对像素（px）值转换为缩放像素（sp）值。
   * 
   * @param pxValue 绝对像素（px）值
   * @return  缩放像素（sp）值
   */ 
  @SimpleFunction
  public static int 到缩放像素(float pxValue) {
    // 取设备屏幕的缩放密度
    final float fontScale = MainActivity.getContext().getResources().getDisplayMetrics().scaledDensity;
    return (int) (pxValue / fontScale + 0.5f);
  }
}